/**
 * 
 */
package com.mc.tool;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

import cn.hutool.core.lang.Console;

/**
 * @author w.weizhen
 *
 */
public class ListMethod {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        
        //removeDuplication();//去除重复
        
//        Map<String, String> map = new HashMap<String, String>();
//        map.put("key", "value");
//        System.out.println(map.toString());
//        map.put("key", "valuex");
//        System.out.println(map.toString());
//        System.out.println(map.get("key"));
//        System.out.println(StringUtils.isBlank(map.get("keyx")));
        
        
        List<List<String>> words = new ArrayList<List<String>>();
        int length = 20;
        for (int i = 0; i < length; i++) 
        {
            words.add(Arrays.asList(new String[20]));
        }
        Console.log(words);
        
    }
    
    //java 两个list 交集 并集 差集 去重复并集
    private static void comparison()
    {
        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new ArrayList<String>();
        //求差集
        list1.removeAll(list2);
        //求并集(不去重)---将一个集合全部加入另一个集合
        list1.addAll(list2);
        //求并集(去重)
        list1.removeAll(list2);
        list1.addAll(list2);
        //求交集
        list1.retainAll(list2);
    }
    //java8 stream.
    //从list集合中取出某一属性的值的集合
    //快速对list集合的筛选计算取值
    private static void stream()
    {
//        //从list集合中取出某一属性的值的集合案例
//        List<Order> list = new ArrayList<User>();
//        Order o1 = new Order("1","MCS-2019-1123");
//        list.add(o1 );
//        Order o2= new Order("2","MCS-2019-1124");
//        list.add(o2);
//        Order o3= new Order("3","MCS-2019-1125");
//        list.add(o3);
//        List<String> orderNoList=list.stream().map(Order::getOrderNo).collect(Collectors.toList());
//        System.out.println("输出单号集合："+orderNoList);
//        List<String> idList=list.stream().map(Order::getId()).collect(Collectors.toList());
//        System.out.println(idList);
//        
//        //遍历-foreach
//        list.stream().forEach(student->{
//            //处理逻辑，打印出所有OrderNo
//            System.out.println(student.getOrderNo());
//        });
//        
//        //筛选list
//        //筛选集合中所有性别为女的学生
//        List<Student> resultList = list.stream().filter(student -> Objects.equals(student.getSex(),"女")).collect(Collectors.toList());
//        resultList.stream().forEach(student->{
//          System.out.println(student.getName());
//        });
//        
//        //list去重
//        //性别去重
//        List<Student> unique = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getSex))), ArrayList::new)); 
//        unique.stream().forEach(student->{
//           System.out.println(student.getName());
//        });
//        
//        //取出list集合对象中某一个属性
//        //取出每个对象中的姓名组成一个新的集合
//        List<String> listStr = list.stream().map(Student::getName).collect(Collectors.toList());
//        //去重
//        List<String> listNew = listStr .stream().map(Student::getName).distinct().collect(Collectors.toList());
//        
//        //list与map互转，并根据某一属性进行分组
//        //list转map (下方studentMap运行会报错，因为作为key值，name不能重复，所以正式开发中应该使用唯一性id作为key值)
//        Map<String, Student> studentMap = list.stream().collect(Collectors.toMap(Student::getName, student -> student));
//        //list转数组
//        String[] listStrs = list.stream()
//        .filter(e -> Objects.equals(e.getSex(), "男"))
//        .sorted(Comparator.comparing(Student::getName))
//        .map(Student::getName).toArray(String[]::new);
//        //list转map并且分组
//        Map<String, List<Student>> listMap = list.stream().collect(Collectors.groupingBy(Student::getSex));
//        //根据对象某些属性，进行分组
//        Map<List, List> studentsMap= list.stream().collect(Collectors.groupingBy(f -> Arrays.asList(f.getAge),f.getSex())));
//        //map转list
//        List<Student> collect = studentMap.values().stream().collect(Collectors.toList());
//        
//        //过滤属性为空的字段
//        Student s6 = new Student("",30,"男");
//        list.add(s6);
//        List<String> stringList = list.stream().map(s -> s.getName()).filter(s -> !s.isEmpty()).collect(Collectors.toList());
//        
//        //根据某一属性进行计算
//        //根据年龄求最大值、最小值、平均值、总和、个数
//        IntSummaryStatistics resultNum = list.stream().mapToInt((item)->item.getAge()).summaryStatistics();
//        System.out.println("max:"+resultNum.getMax());
//        System.out.println("min:"+resultNum.getMin());
//        System.out.println("sum:"+resultNum.getSum());
//        System.out.println("average:"+resultNum.getAverage());
//        System.out.println("count:"+resultNum.getCount());
//        //求和有三种类型，mapToInt，mapToLong，mapToDouble
//        //如果是Bigdecimal数值类型，则计算方法如下,（新建对象）
//        Frult frult1 = new Frult("西瓜",new BigDecimal(1));
//        Frult frult2 = new Frult("梨子",new BigDecimal(2));
//        List<Frult> frultList = new ArrayList<>();
//        frultList.add(frult1);
//        frultList.add(frult2);
//        BigDecimal totalPrice = frultList.stream().map(Frult::getPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
//        //或者用mapToInt()进行强转（int->Bigdecimal）
    }
    
    private static void removeDuplication()
    {
        
        List<Integer> datas = Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8);
        datas = datas.stream().distinct().collect(Collectors.toList());
        System.out.println(datas.toString());
        
//        List<String> datas = new ArrayList<String>();
//        for (int i = 0; i < 10; i++)
//        {
//            String uuid=UUID.randomUUID().toString().replaceAll("-", "");
//            for (int j = 0; j < Math.floor(Math.random() * Math.floor(3)); j++) {
//                datas.add(uuid);
//            }
//        }
//        System.out.println(datas.toString());
//        datas = datas.stream().distinct().collect(Collectors.toList());
//        System.out.println(datas.toString());
        
    }
    
}